﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModelInterface.h"
#include "GraphicsNodeAndTransform.h"

namespace gcmp
{
    class IGraphicsNode;
    class IDocument;
    class GraphicsNodeId;

    /// \brief 表示有向无环图中某一图形节点到另一图形节点的路径
    class GCMP_MODEL_INTERFACE_EXPORT IGraphicsNodePath
    {
    public:
        /// \brief 析构器
        virtual ~IGraphicsNodePath() = 0;

    public:
        /// \brief 克隆节点路径  
        /// \return 克隆返回的节点路径
        virtual OwnerPtr<IGraphicsNodePath> Clone() const = 0;

        /// \brief 获取节点路径
        /// \return 节点路径
        virtual const std::vector<WeakPtr<const IGraphicsNode>>& GetPath() const = 0;

        /// \brief 增加一个节点到路径尾部
        /// \param pNode 节点
        /// \return 无
        virtual void PushbackGraphicsNode(const IGraphicsNode* pNode) = 0;

        /// \brief 在路径尾部弹出一个节点
        /// \return 无
        virtual void PopbackGraphicsNode() = 0;

        /// \brief 获取路径末尾的带有空间变换矩阵的图形节点
        /// \return 带有空间变换矩阵的图形节点
        /// \see GraphicsNodeAndTransform
        virtual GraphicsNodeAndTransform GetLastGraphicsNodeAndTransform() const = 0;

        /// \brief 节点路径是否合法
        /// \return true-合法；false-不合法
        virtual bool isValid() const = 0;

    public:
        /// \brief 创建图形节点路径
        /// \return 图形节点路径
        static OwnerPtr<IGraphicsNodePath> Create();
    };

    /// \brief 图形节点路径集合
    class GCMP_MODEL_INTERFACE_EXPORT IGraphicsNodePathCollection
    {
    public:
        /// \brief 析构器
        virtual ~IGraphicsNodePathCollection() = 0;

    public:
        /// \brief 克隆节点路径集合  
        /// \return 克隆返回的节点路径集合
        virtual OwnerPtr<IGraphicsNodePathCollection> Clone() const = 0;

        /// \brief 获取图形节点路径的集合
        /// \return 图形节点路径的集合
        virtual const std::vector<OwnerPtr<IGraphicsNodePath>>& GetPaths() const = 0;

        /// \brief 增加一个图形节点路径
        /// \param path 图形节点路径
        /// \return 无
        virtual void PushbackGraphicsNodePath(const IGraphicsNodePath& path) = 0;

        /// \brief 增加一个图形节点路径
        /// \param path 图形节点路径
        /// \return 无
        virtual void PushbackGraphicsNodePath(OwnerPtr<IGraphicsNodePath> path) = 0;

        /// \brief 图形节点路径集合是否为空
        /// \return true-空；false-不为空
        virtual bool IsEmpty() const = 0;
    };

    /// \brief 图形节点路径测试器
    ///
    /// 用于测试图形节点路径是否需要收集
    class GCMP_MODEL_INTERFACE_EXPORT IGraphicsNodePathTester
    {
    public:
        /// \brief 析构器
        virtual ~IGraphicsNodePathTester() = 0;

    public:
        /// \brief 图形节点路径是否测试成功
        /// \param nodePath 图形节点路径
        /// \return true-测试成功；false-测试失败
        virtual bool IsDesiredGraphicsNodePath(const IGraphicsNodePath& nodePath) const = 0;
    };

    /// \brief 图形节点处理回调接口
    ///
    /// 找到符合要求的图形节点，并对这些节点调用回调函数，
    /// 须与IGraphicsNodePathTester配合使用
    class GCMP_MODEL_INTERFACE_EXPORT IGraphicsNodeProcessor
    {
    public:
        /// \brief 析构器
        virtual ~IGraphicsNodeProcessor() = 0;

        /// \brief 处理函数
        /// \param pGraphicsNode 需要处理的图形节点
        virtual void Process(IGraphicsNode* pGraphicsNode) = 0;
    };

    /// \brief 图形节点路径收集器
    class GCMP_MODEL_INTERFACE_EXPORT IGraphicsNodePathCollector
    {
    public:
        /// \brief 析构器
        virtual ~IGraphicsNodePathCollector() = 0;

    public:
        /// \brief 遍历测试根节点，得到所有满足节点路径测试器条件的图形节点路径集合
        /// \param pGraphicsNodeTester 节点路径测试器
        /// \return 图形节点路径集合
        virtual OwnerPtr<IGraphicsNodePathCollection> CollectGraphicsNodes(IGraphicsNodePathTester* pGraphicsNodeTester) const = 0;

        /// \brief 遍历测试根节点，得到所有满足节点路径测试器条件的图形节点路径集合
        /// \param pGraphicsNodeTester 节点路径测试器
        /// \param pGraphicsNodeProcessor 节点处理回调接口
        virtual void ProcessGraphicsNodes(IGraphicsNodePathTester* pGraphicsNodeTester, IGraphicsNodeProcessor* pGraphicsNodeProcessor) const = 0;

        /// \brief 遍历测试根节点，得到所有节点id为faceId的BRep面的图形节点路径集合
        /// \param faceId BRep面节点id
        /// \return 图形节点路径集合
        virtual OwnerPtr<IGraphicsNodePathCollection> CollectGraphicsBRepFaceById(const GraphicsNodeId& faceId) const = 0;

        /// \brief 遍历测试根节点，得到所有节点id为edgeId的BRep边的图形节点路径集合
        /// \param edgeId BRep边节点id
        /// \return 图形节点路径集合
        virtual OwnerPtr<IGraphicsNodePathCollection> CollectGraphicsBRepEdgeById(const GraphicsNodeId& edgeId) const = 0;

        /// \brief 遍历测试根节点，得到所有节点id为bodyId的BRep体的图形节点路径集合
        /// \param bodyId BRep体节点id
        /// \return 图形节点路径集合
        virtual OwnerPtr<IGraphicsNodePathCollection> CollectGraphicsBRepBodyById(const GraphicsNodeId& bodyId) const = 0;

        /// \brief 遍历测试根节点，得到所有节点id为gnodeId的图形节点路径集合
        /// \param gnodeId 节点id
        /// \return 图形节点路径集合
        virtual OwnerPtr<IGraphicsNodePathCollection> CollectGraphicsBRepById(const GraphicsNodeId& nodeId) const = 0;

    public:
        /// \brief 根据文档、根图形节点来创建图形节点路径收集器
        /// \param pDoc 文档
        /// \param pRootNode 根图形节点
        /// \return 图形节点路径收集器
        static OwnerPtr<IGraphicsNodePathCollector> Create(const IDocument* pDoc, const IGraphicsNode* pRootNode);
    };
}





